package net.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

/**
 * 	聊天室服务器类
 * @author Administrator
 *
 */
public class Server {
	// 服务器
	private ServerSocket server;
	// 用户的集合
	private Map<String, Socket> users;
	
	/**
	 *	构造方法
	 * @throws IOException
	 */
	public Server() throws IOException {
		this.server = new ServerSocket(8888);
		this.users = new HashMap<String, Socket>();
	}
	
	// 添加用户   删除用户  发消息
	
	/**
	 * 	添加用户方法
	 * @param name 用户的名字
	 * @param socket 用户的socket
	 */
	public void addUser(String name, Socket socket) {
		this.users.put(name, socket);
	}
	
	/**
	 * 	删除用户方法
	 * @param name 用户的名字
	 */
	public void removeUser(String name) {
		this.users.remove(name);
	}
	
	/**
	 * 	发送消息
	 * @param message 消息
	 * @throws IOException 异常
	 */
	public void sendMessage(String message) throws IOException {
		// 遍历在线用户，然后发送消息
		for(Socket socket : users.values()) {
			// 发信息
			OutputStream out = socket.getOutputStream();
			out.write(message.getBytes());
		}
	}
	
	/**
	 * 	启动服务器
	 * @throws IOException 
	 */
	public void start() throws IOException {
		
		while(true) {
			System.out.println("等待客户端连接");
			Socket socket = server.accept();
			System.out.println("一个客户端连接了");
			
			// 使用线程处理下面的东西
			new Thread() {
				public void run() {
					// 1.将连接的用户添加进集合
					String name = socket.getInetAddress().getHostAddress();
					users.put(name, socket);
					
					// 2.需要处理别人发送过来的数据
					try {
						InputStream in = socket.getInputStream();
						byte[] content = new byte[1024];
						int length = in.read(content);
						while(length != -1) {
							String message = new String(content, 0, length);
							sendMessage(name + "说：" +message);
							
							length = in.read(content);
						}
					} catch (IOException e) {
						e.printStackTrace();
					} finally {
						// 清理工作
						// 清除断线的用户
						removeUser(name);
						// 给所有人说该用户断开链接
						try {
							sendMessage(name + "已断开连接");
						} catch (IOException e) {
							e.printStackTrace();
						}
						// 关闭链接
						if(socket != null) {
							try {
								socket.close();
							} catch (IOException e) {
								e.printStackTrace();
							}
						}
					}
				};
			}.start();
		}
	}

}
